package com.foton.mybatis.factory;

import cn.hutool.core.io.FileUtil;
import com.foton.mybatis.configration.Configration;
import com.foton.mybatis.session.DefaultSqlSession;
import com.foton.mybatis.session.SqlSession;
import com.foton.mybatis.util.Constant;
import com.foton.mybatis.util.XmlUtil;

import java.io.File;
import java.net.URL;

/**
 * @Author RenPu
 * @Date 2023/3/29 16:02
 * @Version 1.0
 * @Description:SqlSession默认实现类
 **/
public class DefauletSqlSessionFactory implements SqlSessionFactory {

    private final Configration configration;

    //初始化DefauletSqlSessionFactory对象，同时进行mapper.xml资源的加载
    public DefauletSqlSessionFactory(Configration configration) {
        this.configration = configration;
        //将.替换为/,例如：com.foton.mybatis.dao 转为 com/foton/mybatis/dao,进行读取资源文件
     loadMappersInfo(Constant.MAPPER_LOCATION.replaceAll("\\.","/"));
    }




    /**
     *  根据mybatis.mapper-locations的配置路径，
     *  进行加载解析符合规则的XML文件，同时注册到
     * @param mapperPath
     */
    private void loadMappersInfo(String mapperPath) {

        URL resource = DefauletSqlSessionFactory.class.getClassLoader().getResource(mapperPath);
        File mapperDirs = new File(resource.getFile());
        if(mapperDirs.isDirectory()){
            //显示包下所有文件, 具体文件和文件夹都进行展示
            File[] files = mapperDirs.listFiles();
            if(isNotEmpty(files)){
                for (File file : files) {
                    if(file.isDirectory()){
                     //如果还是文件夹，则进行递归调用加载文件资源
                     loadMappersInfo(mapperPath+"/"+file.getName());
                    }else if(file.getName().endsWith(Constant.MAPPER_FILE_SUFFIX)){

                        //只对xml文件进行解析
                        XmlUtil.readMapperXml(file,this.configration);
                    }
                }
            }
        }
    }


    public static boolean isNotEmpty(File[] files) {
        if (files == null || files.length == 0) {
           return false;
        } else {
           return true;
        }
    }

    @Override
    public SqlSession openSession() {
        SqlSession sqlSession=new DefaultSqlSession(this.configration);
        return sqlSession;
    }
}
